package com.hwh.bootdemoweb.Netty第六章;

import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.DefaultPromise;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author wenhao hu
 * @title: TestNettyPromise
 * @projectName bootdemoweb
 * @description: TODO
 * @date 2021/12/2310:17
 */
@Slf4j
public class TestNettyPromise {
    public static void main(String[] args) {
        //1.创建一个eventLoopGroup
        NioEventLoopGroup group = new NioEventLoopGroup();

        //2.promise的构造函数必须要有一个eventLoop对象
        //promise只是一个结果的容器
        DefaultPromise<Integer> promise = new DefaultPromise<>(group.next());

        ExecutorService service = Executors.newFixedThreadPool(2);
        service.submit(()->{
            try {
                //任意一个对象开始计算，计算完毕后向promise填充结果
                log.debug("开始计算");
                //假设出现一个异常
                int a = 1/0;
                Thread.sleep(1000);
                //在成功时，可以设置一个结果
                promise.setSuccess(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                //在失败的时候设置一个结果
                promise.setFailure(e);
            }

        });
        log.debug("等待结果。。。");
        //设置一个结束结果的线程
        service.submit(()->{
            try {
                //阻塞方法，阻塞到promise得到结果为止
                log.debug("{}",promise.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        });
    }
}
